/**
 * 获取指定key的缓存值
 * @template T - 返回值类型
 * @param key - 缓存键名
 * @returns 对应类型的缓存值，不存在时返回null
 */
export function get<T = unknown>(key: string): T | null {
    try {
        const value = uni.getStorageSync(key)
        return value !== undefined ? value : null
    } catch (e) {
        console.error(`[Storage] Get ${key} error:`, e)
        return null
    }
}

/**
 * 设置缓存数据
 * @param key - 缓存键名
 * @param value - 需要存储的值
 */
export function set(key: string, value: any): void {
    try {
        uni.setStorageSync(key, value)
    } catch (e) {
        console.error(`[Storage] Set ${key} error:`, e)
    }
}

/**
 * 移除指定缓存
 * @param key - 需要移除的缓存键名
 */
export function remove(key: string): void {
    try {
        uni.removeStorageSync(key)
    } catch (e) {
        console.error(`[Storage] Remove ${key} error:`, e)
    }
}

/**
 * 清除所有缓存
 * @param excludeKeys - 需要保留的缓存键名数组（可选）
 */
export function clear(excludeKeys?: string[]): void {
    try {
        if (excludeKeys?.length) {
            const preserved = excludeKeys.map(key => ({ key, value: get(key) }))
            uni.clearStorageSync()
            preserved.forEach(({ key, value }) => {
                if (value !== null) set(key, value)
            })
        } else {
            uni.clearStorageSync()
        }
    } catch (e) {
        console.error('[Storage] Clear error:', e)
    }
}

/**
 * 清除除指定键名外的所有缓存（clear的别名方法）
 * @param excludeKeys - 需要保留的缓存键名数组
 */
export function clearExclude(excludeKeys: string[]): void {
    clear(excludeKeys)
}

import { type App } from 'vue'

export default {
    install(app: App) {
        app.config.globalProperties.$storage = {
            get,
            set,
            remove,
            clear,
            clearExclude
        }
    }
}
